// internal/services/user_service.go
package services

import (
	"errors"
	"fmt"
	"mygin/internal/models"
	"mygin/internal/repositories"
)

type UserService struct {
	repo *repositories.UserRepository
}

func NewUserService(repo *repositories.UserRepository) *UserService {
	return &UserService{repo: repo}
}

func (s *UserService) RegisterUser(user *models.User) error {
	// 这里可以添加业务逻辑，例如校验邮箱格式等
	return s.repo.Create(user)
}

func (s *UserService) GetUserByID(id uint) (*models.User, error) {
	return s.repo.GetByID(id)
}

// UserFilter 筛选条件
type UserFilter struct {
	Username string
	Email    string
}

// ListUsers 获取列表（带分页）
func (s *UserService) ListUsers(page, pageSize int, filter UserFilter) ([]models.User, int64, error) {
	// 调用 repository 的方法
	return s.repo.ListWithPagination(page, pageSize, repositories.UserFilter{
		Username: filter.Username,
		Email:    filter.Email,
	})
}

// 更新全部信息
func (s *UserService) UpdateUser(user *models.User) error {
	// 1. 参数校验
	if user.ID == 0 {
		return errors.New("user ID cannot be empty")
	}

	// 2. 检查用户是否存在
	if _, err := s.repo.GetByID(user.ID); err != nil {
		return errors.New("user not found")
	}

	// 3. 业务逻辑校验（示例：邮箱格式校验）
	if user.Email != "" {
		if !isValidEmail(user.Email) {
			return errors.New("invalid email format")
		}
	}

	// 4. 调用Repository执行更新
	return s.repo.Update(user)
}

// 部分更新
func (s *UserService) UpdatePartial(id uint, data map[string]interface{}) error {
	// 1. 参数校验
	if id == 0 {
		return errors.New("user ID cannot be empty")
	}

	// 2. 检查用户是否存在
	if _, err := s.repo.GetByID(id); err != nil {
		return errors.New("user not found")
	}

	// 3. 业务逻辑校验（示例：邮箱格式校验）
	// if email, ok := data["email"].(string); ok {
	// 	if email != "" && !isValidEmail(email) {
	// 		return errors.New("invalid email format")
	// 	}
	// }

	// 4. 调用Repository执行更新
	return s.repo.UpdatePartial(id, data)
}

// 软删除
func (s *UserService) DeleteUser(id uint) error {
	// 1. 参数校验
	if id == 0 {
		return errors.New("user ID cannot be empty")
	}

	// 2. 检查用户是否存在
	if _, err := s.repo.GetByID(id); err != nil {
		return errors.New("user not found")
	}

	// 3. 业务逻辑校验（示例：检查是否允许删除）
	// if !s.isDeletable(id) {
	//     return errors.New("user cannot be deleted")
	// }

	// 4. 调用Repository执行删除
	//return s.repo.DeleteByID(id) //软删除
	return s.repo.HardDeleteByID(id) //硬删除
}

// 硬删除
func (s *UserService) ForceDeleteUser(id uint) error {
	// 1. 参数校验
	if id == 0 {
		return errors.New("user ID cannot be empty")
	}

	// 2. 检查用户是否存在
	if _, err := s.repo.GetByID(id); err != nil {
		return errors.New("user not found")
	}

	// 3. 调用Repository执行硬删除
	return s.repo.HardDeleteByID(id)
}

// 辅助方法：邮箱格式校验（示例）
// func isValidEmail(email string) bool {
// 	// 这里实现实际的邮箱校验逻辑
// 	return len(email) > 0 && len(email) <= 255
// }

/***
**************非curd方法区************************************/

func (s *UserService) GetUserByUsername(username string) (*models.User, error) {
	return s.repo.FindByUsername(username)
}

func (s *UserService) UserWithOrders(id uint) (map[string]interface{}, error) {
	// 1. 参数校验
	if id == 0 {
		return nil, errors.New("user ID cannot be empty")
	}
	// 2. 调用Repository
	data, err := s.repo.GetUserWithOrders(id)
	if err != nil {
		return nil, fmt.Errorf("failed to get orders: %w", err)
	}

	// 3. 业务逻辑处理（示例）
	// if len(data) == 0 {
	//     return nil, errors.New("no orders found")
	// }
	// 4. 返回处理后的数据
	return map[string]interface{}{
		"user_data": data,
		"formatted": fmt.Sprintf("User %v has %d orders", data["username"], len(data)),
	}, nil
}
